package com.tmt.im.common.pojo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.tmt.im.common.annotation._AllowUpdate;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import org.apache.ignite.cache.query.annotations.QuerySqlField;

import java.io.Serial;
import java.sql.Timestamp;

/**
 * 聊天会话PoJo对象
 *
 * @Description TODO
 * @Author wuyi
 * @Date 2024/8/7 15:07
 * @Version 1.0
 **/
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class ChatSessionPoJo implements IGetKey<Long> {

    @Serial
    private static final long serialVersionUID = -2461820205026251987L;

    public static final String CACHE_NAME = "chat_session";

    @QuerySqlField(name = "id", index = true)
    private Long id;

    /**
     * 聊天会话名称
     */
    @QuerySqlField(name = "name")
    @_AllowUpdate
    private String name;

    /**
     * 群组头像，存储的是头像图片的访问URI。
     */
    @QuerySqlField(name = "avatar")
    @_AllowUpdate
    private String avatar;

    /**
     * 聊天会话类型
     */
    @QuerySqlField(name = "type")
    private String type;

    /**
     * 群发言状态。仅对GROUP类型的会话有效。
     * 0（默认）：取消群组禁言。
     * 1：禁言全体普通成员，不包括群主和管理员。
     * 3：禁言全体成员。"
     */
    @QuerySqlField(name = "chat_banned")
    @_AllowUpdate
    private Integer chatBanned = 0;

    /**
     * 本群是否禁止成员相互加为好友
     */
    @QuerySqlField(name = "forbid_add_friend")
    @_AllowUpdate
    private boolean forbidAddFriend;

    @QuerySqlField(name = "allow_red_package")
    @_AllowUpdate
    private boolean allowRedPackage;

    /**
     * 通过 SDK 侧操作申请入群的验证方式。
     * 0（默认）：无需验证，直接入群。
     * 1：需要群主或管理员验证通过才能入群。
     * 2：不允许任何人申请入群。
     */
    @QuerySqlField(name = "join_mode")
    @_AllowUpdate
    private Integer joinMode;

    /**
     * 群创建完成后，邀请入群时是否需要被邀请人的同意
     * 0，需要同意（默认）。1，不需要同意
     */
    @QuerySqlField(name = "be_invited_mode")
    @_AllowUpdate
    private Integer beInvitedMode;

    /**
     * 邀请权限，即谁可以邀请他人入群。
     * 0（默认）：群主和管理员。
     * 1：所有人。
     */
    @QuerySqlField(name = "invite_mode")
    @_AllowUpdate
    private Integer inviteMode;

    /**
     * 客户端修改群组信息的权限，即谁可以修改群组信息。
     * 0（默认）：群主和管理员。
     * 1：所有人。
     */
    @QuerySqlField(name = "update_team_info_mode")
    @_AllowUpdate
    private Integer updateTeamInfoMode;

    /**
     * 客户端修改群自定义扩展信息（server_extension&extension）权限，即谁可以修改群自定义扩展信息。
     * 0（默认）：群主和管理员。
     * 1：所有人。
     */
    @QuerySqlField(name = "update_extension_mode")
    @_AllowUpdate
    private Integer updateExtensionMode;

    /**
     * 群公告信息
     */
    @QuerySqlField(name = "announcement")
    @_AllowUpdate
    private String announcement;

    /**
     * 群介绍
     */
    @QuerySqlField(name = "introduce")
    @_AllowUpdate
    private String introduce;

    /**
     * 聊天会话的群主， 双人会话类型时本字段等于会话创建人。
     */
    @QuerySqlField(name = "owner_id")
    @_AllowUpdate
    private Long ownerId;

    /**
     * 创建者ID
     */
    @QuerySqlField(name = "creator_id")
    private Long creatorId;

    /**
     * 云信平台允许的最大成员数量,默认是5000.
     */
    @QuerySqlField(name = "max_member_amount")
    private int maxMemberAmount;

    /**
     * 群主设置的最大成员数量，不能大于maxMemberAmount。
     */
    @QuerySqlField(name = "member_amount_limit")
    @_AllowUpdate
    private int memberAmountLimit = -1;

    /**
     * 创建时间
     */
    @QuerySqlField(name = "create_time", index = true)
    private Timestamp createTime;

    @QuerySqlField(name = "deleted")
    @_AllowUpdate
    private boolean deleted = false;

    @QuerySqlField(name = "delete_time")
    @_AllowUpdate
    private Timestamp deleteTime;

    /**
     * 数据版本
     */
    @QuerySqlField(name = "version")
    private Long version;

    @JsonIgnore
    private boolean insert = true;

    @Override
    public Long getKey() {
        return id;
    }

}
